www.gusucode.com > VC++ 自制SQL数据库,含有服务端+客户端-源码程序 > VC++ 自制SQL数据库,含有服务端+客户端-源码程序/code/Server/SQLGram.cpp
//Download by http://www.NewXing.com // SQL syntax used for coloring in CMiniSQLView // by LuXiaochun //////////////////////////////////////////////////////////////// #include "stdafx.h" #include "miniSQLView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //SQL key words static LPTSTR s_apszSQLKeywordList[] = { _T("select"), _T("distinct"), _T("unique"), _T("from"), _T("where"), _T("as"), _T("by"), _T("having"), _T("group"), _T("order"), _T("not"), _T("null"), _T("create"), _T("drop"), _T("table"), _T("index"), _T("primary"), _T("reference"), _T("key"), _T("check"), _T("type"), _T("in"), _T("into"), _T("on"), _T("and"), _T("or"), _T("between"), _T("max"), _T("min"), _T("all"), _T("some"), _T("count"), _T("char"), _T("varchar"), _T("int"), _T("long"), _T("decimal"), _T("float"), _T("date"), _T("str"), _T("set"), _T("insert"), _T("delete"), _T("update"), _T("values"), _T("exit"), _T("exec"), NULL }; static BOOL IsSQLKeyword(LPCTSTR pszChars, int nLength) { char* tmp = strdup( pszChars ); for (unsigned int i=0; i<strlen(tmp); i++) tmp[i] = tolower(tmp[i]); for (int L = 0; s_apszSQLKeywordList[L] != NULL; L ++) { if (strncmp(s_apszSQLKeywordList[L], tmp, nLength) == 0 && s_apszSQLKeywordList[L][nLength] == 0) { delete tmp; return TRUE; } } delete tmp; return FALSE; } static BOOL IsSQLNumber(LPCTSTR pszChars, int nLength) { if (nLength > 2 && pszChars[0] == '0' && pszChars[1] == 'x') { for (int I = 2; I < nLength; I++) { if (isdigit(pszChars[I]) || (pszChars[I] >= 'A' && pszChars[I] <= 'F') || (pszChars[I] >= 'a' && pszChars[I] <= 'f')) continue; return FALSE; } return TRUE; } if (! isdigit(pszChars[0])) return FALSE; for (int I = 1; I < nLength; I++) { if (! isdigit(pszChars[I]) && pszChars[I] != '+' && pszChars[I] != '-' && pszChars[I] != '.' && pszChars[I] != 'e' && pszChars[I] != 'E') return FALSE; } return TRUE; } #define DEFINE_BLOCK(pos, colorindex) \ ASSERT((pos) >= 0 && (pos) <= nLength);\ if (pBuf != NULL)\ {\ if (nActualItems == 0 || pBuf[nActualItems - 1].m_nCharPos <= (pos)){\ pBuf[nActualItems].m_nCharPos = (pos);\ pBuf[nActualItems].m_nColorIndex = (colorindex);\ nActualItems ++;}\ } #define COOKIE_COMMENT 0x0001 #define COOKIE_PREPROCESSOR 0x0002 #define COOKIE_EXT_COMMENT 0x0004 #define COOKIE_STRING 0x0008 #define COOKIE_CHAR 0x0010 DWORD CMiniSQLView::ParseLine(DWORD dwCookie, int nLineIndex, TEXTBLOCK *pBuf, int &nActualItems) { int nLength = GetLineLength(nLineIndex); if (nLength <= 0) return dwCookie & COOKIE_EXT_COMMENT; LPCTSTR pszChars = GetLineChars(nLineIndex); BOOL bFirstChar = (dwCookie & ~COOKIE_EXT_COMMENT) == 0; BOOL bRedefineBlock = TRUE; BOOL bDecIndex = FALSE; int nIdentBegin = -1; for (int I = 0; ; I++) { if (bRedefineBlock) { int nPos = I; if (bDecIndex) nPos--; if (dwCookie & (COOKIE_COMMENT | COOKIE_EXT_COMMENT)) { DEFINE_BLOCK(nPos, COLORINDEX_COMMENT); } else if (dwCookie & (COOKIE_CHAR | COOKIE_STRING)) { DEFINE_BLOCK(nPos, COLORINDEX_STRING); } else if (dwCookie & COOKIE_PREPROCESSOR) { DEFINE_BLOCK(nPos, COLORINDEX_PREPROCESSOR); } else { DEFINE_BLOCK(nPos, COLORINDEX_NORMALTEXT); } bRedefineBlock = FALSE; bDecIndex = FALSE; } if (I == nLength) break; if (dwCookie & COOKIE_COMMENT) { DEFINE_BLOCK(I, COLORINDEX_COMMENT); dwCookie |= COOKIE_COMMENT; break; } // String constant "...." if (dwCookie & COOKIE_STRING) { if (pszChars[I] == '"' && (I == 0 || pszChars[I - 1] != '\\')) { dwCookie &= ~COOKIE_STRING; bRedefineBlock = TRUE; } continue; } // Char constant '..' if (dwCookie & COOKIE_CHAR) { if (pszChars[I] == '\'' && (I == 0 || pszChars[I - 1] != '\\')) { dwCookie &= ~COOKIE_CHAR; bRedefineBlock = TRUE; } continue; } // if (dwCookie & COOKIE_EXT_COMMENT) // { // if (pszChars[I] == '}') // { // dwCookie &= ~COOKIE_EXT_COMMENT; // bRedefineBlock = TRUE; // } // continue; // } // Extended comment /*....*/ if (dwCookie & COOKIE_EXT_COMMENT) { if (I > 0 && pszChars[I] == '/' && pszChars[I - 1] == '*') { dwCookie &= ~COOKIE_EXT_COMMENT; bRedefineBlock = TRUE; } continue; } // Extended comment {} if (I > 0 && pszChars[I] == '/' && pszChars[I - 1] == '/') { DEFINE_BLOCK(I - 1, COLORINDEX_COMMENT); dwCookie |= COOKIE_COMMENT; break; } // Preprocessor directive #.... if (dwCookie & COOKIE_PREPROCESSOR) { if (I > 0 && pszChars[I] == '*' && pszChars[I - 1] == '/') { DEFINE_BLOCK(I - 1, COLORINDEX_COMMENT); dwCookie |= COOKIE_EXT_COMMENT; } continue; } // Normal text if (pszChars[I] == '"') { DEFINE_BLOCK(I, COLORINDEX_STRING); dwCookie |= COOKIE_STRING; continue; } if (pszChars[I] == '\'') { DEFINE_BLOCK(I, COLORINDEX_STRING); dwCookie |= COOKIE_CHAR; continue; } // if (pszChars[I] == '{') // { // DEFINE_BLOCK(I, COLORINDEX_COMMENT); // dwCookie |= COOKIE_EXT_COMMENT; // continue; // } if (I > 0 && pszChars[I] == '*' && pszChars[I - 1] == '/') { DEFINE_BLOCK(I - 1, COLORINDEX_COMMENT); dwCookie |= COOKIE_EXT_COMMENT; continue; } if (bFirstChar) { if (pszChars[I] == '#') { DEFINE_BLOCK(I, COLORINDEX_PREPROCESSOR); dwCookie |= COOKIE_PREPROCESSOR; continue; } if (! isspace(pszChars[I])) bFirstChar = FALSE; } if (pBuf == NULL) continue; // We don't need to extract keywords, // for faster parsing skip the rest of loop if( pszChars[I] == '+' || pszChars[I] == '-' || pszChars[I] == '=' || pszChars[I] == '<' || pszChars[I] == '>' || pszChars[I] == '!') { DEFINE_BLOCK(I, COLORINDEX_OPERATOR); bRedefineBlock = TRUE; continue; } if( pszChars[I] == '*' /*|| pszChars[I] == '/' */) { DEFINE_BLOCK(I, COLORINDEX_OPERATOR); bRedefineBlock = TRUE; continue; } if (isalnum(pszChars[I]) || pszChars[I] == '_' || pszChars[I] == '.') { if (nIdentBegin == -1) nIdentBegin = I; } else { if (nIdentBegin >= 0) { if (IsSQLKeyword(pszChars + nIdentBegin, I - nIdentBegin)) { DEFINE_BLOCK(nIdentBegin, COLORINDEX_KEYWORD); } else if (IsSQLNumber(pszChars + nIdentBegin, I - nIdentBegin)) { DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER); } bRedefineBlock = TRUE; bDecIndex = TRUE; nIdentBegin = -1; } } } if (nIdentBegin >= 0) { if (IsSQLKeyword(pszChars + nIdentBegin, I - nIdentBegin)) { DEFINE_BLOCK(nIdentBegin, COLORINDEX_KEYWORD); } else if (IsSQLNumber(pszChars + nIdentBegin, I - nIdentBegin)) { DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER); } } if (pszChars[nLength - 1] != '\\') dwCookie &= COOKIE_EXT_COMMENT; return dwCookie; }